package com.pinyougou.service;

import com.lening.pojo.TbSeller;
import com.lening.sellergoods.service.SellerService;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

import java.util.ArrayList;
import java.util.List;

/**
 * 创作时间：2020/5/28 9:51
 * 作者：李增强
 * 实现UserDetailsService接口，重新里面的loadUserByUsername方法，
 * 然后我们在页面输入的用户名在这里就能拿到
 */
public class UserDetailsServiceImpl implements UserDetailsService {

    /**
     *现在密码是写死的，用户随便输入，我们需要用用户名去数据查询，然后密码进行比对
     * 登录
     */

    /**
     * 配置文件方式注入，没有用注解，因为我们需要在配置文件中进行一些比的设置
     *
     */
    private SellerService sellerService;

    public void setSellerService(SellerService sellerService) {
        this.sellerService = sellerService;
    }

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        /**
         * 拿到了之后，可以在这里鉴权
         * GrantedAuthority是已经授予的权限
         * 我们这个里面已经授予的权限是ROLE_SELLER，放回去了，给了spring安全的权限集合
         */
        List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>();
        grantedAuths.add(new SimpleGrantedAuthority("ROLE_SELLER"));

        /**
         * username是输入进来，目前没有处理，密码123456，写死了，也没有去数据库查询，
         * 只要用户名随便输入，密码是123456就OK啦
         */
        /**
         * 用户名就是商家的id，直接用id去查询
         */

        TbSeller seller = sellerService.findOne(username);
        System.out.println(username);
        System.out.println(seller.getStatus());
        if(seller!=null){
            /**
             * 查询到了，然后判断状态，注册了，商家审核通过了，才能登录
             * 必须状态为1的才能登录，不是1的不等登录，但是直接抛异常，我们没有捕获异常
             */
            if("1".equals(seller.getStatus())){
                /**
                 * 平时我们是自己的在这里判断的，有了安全框架后，只要把从数据库查询出来的密码，
                 * 给安全框架，他就会自己去判断
                 */
                return new User(username,seller.getPassword(),grantedAuths);
            }else{
                return null;
            }
        }else{
            return  null;
        }

        //return new User(username,"123456", grantedAuths);
    }
}
